/**
在 Express 中，中间件是处理请求和响应的核心机制。中间件可以是同步的，也可以是异步的。
  1. 中间件的概念
  中间件是一个函数，它接收三个参数： `req` （请求对象）、 `res` （响应对象）和  `next` （下一个中间件的回调函数）。中间件可以在请求到达路由处理程序之前或之后执行某些操作。

  2. 同步中间件的执行过程
  同步中间件的执行过程如下：
  1. 请求到达：当客户端发送请求时，Express 会将请求传递给注册的中间件。
  2. 执行中间件：中间件函数被调用，执行其中的逻辑。
  3. 调用  `next()` ：如果中间件需要将控制权传递给下一个中间件，需要调用  `next()`  函数。如果不调用  `next()` ，请求将停留在当前中间件，后续的中间件将不会被执行。
  4. 响应处理：在所有中间件执行完毕后，最终的路由处理程序将处理响应并返回给客户端。

  3. 同步中间件的示例
  以下是一个简单的同步中间件示例：
  const express = require('express');
  const app = express();

  // 第一个中间件
  app.use((req, res, next) => {
      console.log('请求到达中间件');
      // 这里可以进行一些同步操作
      next(); // 调用下一个中间件
  });

  // 第二个中间件
  app.use((req, res, next) => {
      console.log('处理请求');
      // 这里可以进行一些同步操作
      next(); // 调用下一个中间件
  });

  // 路由处理
  app.get('/', (req, res) => {
      res.send('Hello, Express!');
  });

  // 启动服务器
  app.listen(3000, () => {
      console.log('Server is running on http://localhost:3000');
  });
  4. 中间件的执行顺序
  中间件的执行顺序是按照注册的顺序进行的。上面的示例中， `app.use()`  注册的中间件会按照它们的顺序依次执行。

  5. 错误处理
  在同步中间件中，如果遇到错误，可以通过  `next(err)`  调用来将错误传递给错误处理中间件：
  app.use((req, res, next) => {
      try {
          // 可能抛出错误的操作
          throw new Error('Something went wrong!');
      } catch (err) {
          next(err); // 将错误传递给下一个错误处理中间件
      }
  });

  // 错误处理中间件
  app.use((err, req, res, next) => {
      res.status(500).send({ message: err.message });
  });
  总结
  在 Express 中，同步中间件是处理请求和响应的重要组成部分。通过合理使用中间件，可以实现请求的预处理、响应的后处理、错误处理等功能。了解中间件的执行过程和如何管理控制权是开发 Express 应用的关键。
 */
const express = require("express");

const app = express(); // 创建一个express应用

app.use((req, res, next) => {
  console.log("express middleware 1");
  req.msg = "hello express";
  next();
  // 返回值结果
  res.json(req.msg); // "hello express world express02 world express03"
});

app.use((req, res, next) => {
  console.log("express middleware 2");
  req.msg += " world express02";
  next();
});

app.use((req, res, next) => {
  console.log("express middleware 3");
  req.msg += " world express03";
});

app.listen(8000, () => {
  console.log("express server running at http://127.0.0.1:8000");
});
